<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<img src="images/8-2-4-prototype.png"/>
<script>

    /*
        1.原型模式
            问题:
                所有的属性都共享了
     */
    function Person() {

    }

    Person.prototype.name = 'Jack'
    Person.prototype.age = 29
    Person.prototype.job = '资本家'
    Person.prototype.sayName = function () {
        console.log(this.name)
    }

    let person1 = new Person();
    person1.sayName();
    let person2 = new Person();
    console.log(person1.sayName() === person2.sayName()) // true

    /*
           getPrototypeOf()
           setPrototypeOf()  不建议使用
                -可以用Object.create()代替
     */
    console.log(Object.getPrototypeOf(person1) === Person.prototype) // true


    /*
        3. 原型和in操作符
            - in操作符在可以通过对象访问指定属性时返回true,无论是否在实例还是原型上
             
            hasOwnProperty()方法是判断属性是否在自身上
     */
    let obj = {
        age: undefined
    }
    obj.__proto__.age = 66
    console.log('age' in obj)   // true
    delete obj.age;
    console.log('age' in obj)   // false
    // 要确定属性是否在原型上时
    function hasPrototypeProperty(object, name) {
        return !object.hasOwnProperty(name) && (name in object)
    }
    // todo:1.怎么获取自身的属性? 2.怎么获取原型对象上的属性? 3.怎么获取全部的属性 4.Object上面的各种方法 
    
    /*
        4.属性枚举顺序
        
            // 下面这两个枚举顺序不确定
            for-in
            Object.keys()
            
            //  下面这3个枚举顺序确定
            Object.getOwnPropertyNames()
            Object.getOwnPropertySymbols()
            Object.assign()
     */
    
    

</script>
</body>
</html>